package com.hyts.bmsp.interceptor;

import java.io.IOException;

import com.hyts.bmsp.session.WebSessionManager;
import org.apache.commons.lang.ArrayUtils;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.log.Log;

/**
 * 
 * @ClassName: SessionInterceptor
 * @Description: 传统 AOP 实现需要引入大量繁杂而多余的概念， 例如： Aspect、 Advice、 Joinpoint、 Poincut、<br>
				 Introduction、 Weaving、 Around 等等， 并且需要引入 IOC 容器并配合大量的 XML 或者 annotation<br>
				  来进行组件装配。传统 AOP 不但学习成本极高，开发效率极低，开发体验极差，而且还影响系统性能，尤<br>
				  其是在开发阶段造成项目启动缓慢，极大影响开发效率。<br>
				 JFinal 采用极速化的 AOP 设计，专注 AOP 最核心的目标，将概念减少到极致，仅有三个<br>
				 概念：Interceptor、Before、Clear，并且无需引入 IOC 也无需使用繁杂的 XML。<br>
 * @author: 李博/Alex
 * @date: 2017-1-8 上午10:44:51
 */
public class SessionInterceptor implements Interceptor{

	/**
	 * @fieldName: logger
	 * @fieldType: Logger
	 * @Description: 日志输出器
	 */
	private static final Log log = Log.getLog(SessionInterceptor.class);
	
	public static String[] EXCLUDE_URI_PATH;
	
	/**
	 	void invoke()  传递本次调用，调用剩下的拦截器与目标方法<br>
		Controller getController()  获取 Action 调用的 Controller 对象（仅用于控制层拦截）<br>
		String getActionKey()  获取 Action 调用的 action key 值（仅用于控制层拦截）<br>
		String getControllerKey()  获取 Action 调用的 controller key 值（仅用于控制层拦截）<br>
		String getViewPath()  获取 Action 调用的视图路径（仅用于控制层拦截）<br>
		<T> T getTarget()  获取被拦截方法所属的对象<br>
		Method getMethod()  获取被拦截方法的 Method 对象<br>
		String getMethodName()  获取被拦截方法的方法名<br>
		Object[] getArgs()  获取被拦截方法的所有参数值<br>
		Object getArg(int)  获取被拦截方法指定序号的参数值<br>
		<T> T getReturnValue()  获取被拦截方法的返回值<br>
		void setArg(int)  设置被拦截方法指定序号的参数值<br>
		void setReturnValue(Object)  设置被拦截方法的返回值<br>
		boolean isActionInvocation()  判断是否为 Action 调用，也即是否为控制层拦截<br>
	 */
	/* (non Javadoc)
	 * @Title: intercept
	 * @Description: TODO
	 * @param inv
	 * @see com.jfinal.aop.Interceptor#intercept(com.jfinal.aop.Invocation)
	 */
	@Override
	public void intercept(Invocation inv) {
		
		//判断是否属于Action控制层请求类型
		if(inv.isActionInvocation()){
			
			log.debug("进入Session会话校验拦截器......");
			log.debug("-ControllerKey:"+inv.getControllerKey());
			log.debug("-ControllerClassName"+inv.getController().getClass().getName());
			log.debug("--MethodName:"+inv.getMethodName());
			log.debug("--ViewPath:"+inv.getViewPath());
			String sessionTokenValue = WebSessionManager.getAttribute(inv.getController().getRequest(),WebSessionManager.SESSION_KEY_TOKEN)+"";
			
			if(ArrayUtils.contains(EXCLUDE_URI_PATH,inv.getViewPath()) || WebSessionManager.SESSION_VALUE_TOKEN.equals(sessionTokenValue))
			{
				log.debug("成功校验Session标志-成功重定向："+inv.getViewPath());
				inv.invoke();
			}
			else
			{
				try 
				{
					inv.getController().getResponse().sendRedirect(inv.getController().getRequest().getContextPath());
					log.debug("失败校验Session标志-无法重定向："+inv.getViewPath());
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
			log.debug("退出Session回话校验拦截器......");
		}
	}
	
}
